// 装饰器：是一个特殊的类型，实质是一个函数，函数参数是根据装饰对象的不同参数也是不一样的，
//使用装饰器以@expression进行使用，装饰器目前是实验性的技术，所以在编译配置文件添加
//experimentalDecorators：true ，启用装饰器
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
// 如果在一个类前面添加一个装饰器：类装饰器，函数参数是类的构造函数
// 在一个类方法前添加一个装饰器：方法装饰器：函数参数是构造函数，方法名字、
//  如果写在一个属性前，是属性装饰器
// 如果写在函数的参数前，称之为参数装饰器
// 根据装饰对象不一样，功能也是不一样的 装饰器函数必须在装饰对象的上面
// 装饰类时，唯一的参数就是类的构造函数
function dec(con) {
    console.log(con);
    con.prototype.say = function () {
        console.log("我是装饰器函数，可以通过参数是构造函数中添加say方法");
    };
}
// 类装饰器
let AAA = class AAA {
    constructor(name) {
        this.name = name;
    }
};
AAA = __decorate([
    dec
], AAA);
let a9 = new AAA("小明");
a9.say();
let BBB = class BBB {
    constructor(name) {
        this.name = name;
    }
};
BBB = __decorate([
    dec
], BBB);
let bbb1 = new BBB("xx");
bbb1.say();
//方法修饰器
function hack(itsClass, itsName, descriptor) {
    let oldValue = itsClass[itsName]; // 正在修饰的方法 老方法
    const newDemo = function () {
        console.log("我是新方法", oldValue); //输出两句话
    };
    descriptor.value = newDemo;
}
class CCC {
    constructor(name) {
        this.name = name;
    }
    demo() {
        console.log("demo");
    }
}
__decorate([
    hack
], CCC.prototype, "demo", null);
let hk = new CCC("uhjj");
hk.demo();
